#pragma once

#include "../Algorithm.h"
#include "common_data.h"
#include "./StackSetting/stackshapmanager.h"

enum class StackDir {
	stack_dir_first = 1,	// 右上->左下 第一象限开始
	stack_dir_second = 2,	// 左上->右下 第二象限
	stack_dir_third = 3,	// 左下->右上 第三象限
	stack_dir_foruth = 4,	// 右下->左上 第四象限
	stack_dir_max,
};

class StackCommon : public Algorithm
{

public:
	StackCommon();
	~StackCommon();

	/*算法初始化接口*/
	virtual bool Init(const AlgInit& init, const QString& other) override;

	virtual bool InitSkuInfo(const AlgSkuInfo& sku, QString& result) override;

	virtual bool Calculate(const QString& input, Position& pos, QString& output) override;

	virtual bool ExcuteCmd(int cmd, const QString& input, QString& output) override;

private:
	bool SortSkuPos(QVector<stack::SkuPosInfo>& pos, StackDir type);
	bool SortSkuGroupPos(QVector<QVector<stack::SkuPosInfo>>& pos, StackDir type);
	int GetNextGrabNum(int grabed);

	bool GetGrabSkuPosition(int grabed, int num, Position& out);
private:
	Position m_plate = {};	// 托盘基准坐标
	Size m_plateRang = {};	// 托盘容积
	Size m_sku = {};		// 物料尺寸
	StackDir m_dirOdd = StackDir::stack_dir_max;	// 奇数层码垛方向
	StackDir m_dirEven = StackDir::stack_dir_max;   // 偶数层码垛方向
	StackShapManager* m_shap = nullptr;
	stack::StackInfo m_stackInfo = {};
	QVector<stack::SkuPosInfo> oddpos;	// 奇数层物料坐标（托盘坐标系)
	QVector<stack::SkuPosInfo> evenpos;	// 偶数层物料坐标（托盘坐标系)

	QVector<QVector<stack::SkuPosInfo>> m_oddpos;	// 奇数层物料坐标（托盘坐标系)
	QVector<QVector<stack::SkuPosInfo>> m_evenpos;	// 奇数层物料坐标（托盘坐标系)
};
